/**
 * @addtogroup bsc_gps_device
 * bsc_gps_device
 * @{
 */
/**
 * @file         bsc_gps_device.h
 * @brief        gps设备
 * @note    
 * @author       Akee(ysk@hopechart.com，尤胜坤)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-11-21  <td>1.0                   <td>Akee            <td>创建初始版本
 * <tr><td>2022-10-28  <td>1.1                   <td>Akee            <td>名字从gps_device.h改为bsc_gps_device.h,所有类型加Bs前缀
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _BSC_GPS_DEVICE_H_
#define _BSC_GPS_DEVICE_H_

#include "bsc_gps_common.h"
#include <nmea/nmea_types.h>
#ifdef __cplusplus
extern "C" {
#endif

enum TGnssResetStatusTag 
{
    kBsGnssResetStatusInit  = 0,      ///< 初始化状态
    kBsGnssResetStatusBegin = 1,      ///< GNSS模块重启了
    kBsGnssResetStatusEnd   = 2,      ///< GNSS模块重启完成
};
typedef enum TGnssResetStatusTag TGnssResetStatus;
    
typedef struct TBsGpsDeviceCallbackTag TBsGpsDeviceCallback;

typedef void(*TBsGpsDeviceDoLocationCallback)(TBsGpsDeviceCallback *callback, const TBsGpsLocation *location);
typedef void(*TBsGpsDeviceDoSvsStatusCallback)(TBsGpsDeviceCallback *callback, const TBsGpsSvStatus *svs_status);


struct TBsGpsDeviceCallbackTag
{
    TBsGpsDeviceDoLocationCallback DoLocation;
    TBsGpsDeviceDoSvsStatusCallback DoSvsStatus;
};

/**
 * gps设备
 */
typedef struct TBsGpsDeviceTag TBsGpsDevice;
struct TBsGpsDeviceTag
{
    /// 定位信息存储
    TBsGpsLocation location;
    /// 卫星状态存储
    TBsGpsSvStatus svstatus;

    TBsGpsDeviceCallback *callback;
    /// 在用卫星数组
    UInt8 sv_in_fix[BS_GPS_MAX_SVS];

    /// 最近定位tick
    UInt32 last_loc_tick;
    /// 天线状态
    TGpsAntennaStatus antenna_stat;

    UInt32 nmea_gga_tick;
    UInt32 nmea_rmc_tick;
    UInt32 nmea_gsv_tick;
    UInt32 nmea_gsa_tick;

    Int32 filter_max;
    Int32 filter_num;
};

/**
 * 构造函数
 * @param self: 对象指针
 * @return 
 */
void TBsGpsDeviceCreate(TBsGpsDevice *self, TBsGpsDeviceCallback *callback);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void TBsGpsDeviceDestroy(TBsGpsDevice *self);

/**
 * rmc数据更新
 * @param self: 对象指针
 * @param rmc: rmc数据
 * @return
 */
void TBsGpsDeviceOnRmcUpdated(TBsGpsDevice *self, const TNmeaRmc *rmc);

/**
 * gga数据更新
 * @param self: 对象指针
 * @param gga: gga数据
 * @return
 */
void TBsGpsDeviceOnGgaUpdated(TBsGpsDevice *self, const TNmeaGga *gga);

/**
 * gsa数据更新
 * @param self: 对象指针
 * @param constellation: 星座系统
 * @param gsa: gsa数据
 * @return
 */
void TBsGpsDeviceOnGsaUpdated(TBsGpsDevice *self, TBsGpsConstellation constellation, const TNmeaGsa *gsa);

/**
 * gsv数据更新
 * @param self: 对象指针
 * @param constellation: 星座系统 
 * @param gsv: gsv数据
 * @return
 */
void TBsGpsDeviceOnGsvUpdated(TBsGpsDevice *self, TBsGpsConstellation constellation, const TNmeaGsv *gsv);

/**
 * 最后一次定位的定位时间
 * @param self: 对象指针
 * @return 定位时间,单位:ms
 */
UInt32 TBsGpsDeviceLastLocTick(TBsGpsDevice *self);

void TBsGpsDeviceSetLastLocTick(TBsGpsDevice *self, UInt32 tick);
#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */
 
 
 
 
 
 
 
 
 
 
 
